1 성별, 연령별

공공데이터 포털에서 데이터 가져오기를 통해 입수한 데이터를 후속 시각화와 모형개발 작업을 위해 깔끔한 정제작업을 수행한다. 특히, 2020-11-06 중복된 행이 포함되어 중복 제거작업을 선행하여 처리한다. 2020-04-02 ~ 2020-04-06 사이 결측값이 있어 pad_by_time() 함수로 결측된 기간을 생성시키고 나서, ts_impute_vec() 함수로 선형보간(period = 1)을 통해 결측값을 채워넣어 정제작업이 완료된 데이터를 가지고 탐색적 데이터 작업을 수행한다.

library(tidyverse)
library(httr)
library(rvest)
library(glue)
library(lubridate)

covid_age_gender_df <- read_rds("data/covid_age_gender_clean.rds")

covid_age_gender_df
# A tibble: 2,949 x 7
   날짜       구분  검사자 확진자 사망자  감염율 치명율
   <date>     <chr>  <dbl>  <dbl>  <dbl>   <dbl>  <dbl>
 1 2020-04-02 0-9    9825.   112       0  0.0114      0
 2 2020-04-03 0-9    9925.   115.      0 NA          NA
 3 2020-04-04 0-9   10026.   118.      0 NA          NA
 4 2020-04-05 0-9   10127.   120.      0 NA          NA
 5 2020-04-06 0-9   10227.   123.      0 NA          NA
 6 2020-04-07 0-9   10328.   126       0  0.0122      0
 7 2020-04-08 0-9   10413.   126       0  0.0121      0
 8 2020-04-09 0-9   10407.   128       0  0.0123      0
 9 2020-04-10 0-9   10488.   129       0  0.0123      0
10 2020-04-11 0-9   10484.   130       0  0.0124      0
# ... with 2,939 more rows

1.1 * 추세

탐색적 데이터 분석을 통해 전반적인 추세를 살펴봄으로 인해 숨겨진 데이터의 오류도 찾아낼 수 있다.

library(timetk)

covid_age_daily_df <- covid_age_gender_df %>% 
  filter(날짜 >= "2020-04-09") %>% 
  filter(!str_detect(구분, pattern = "(남성)|(여성)")) %>% 
  timetk::summarise_by_time(.date_var = 날짜, 
                            .by = "day", 
                            누적검사자 = sum(검사자),
                            누적확진자 = sum(확진자),
                            누적사망자 = sum(사망자)
                            ) %>% 
  mutate(누적사망자 = ifelse(between_time(날짜, start_date = "2020-08-02", end_date = "2020-08-03"), 301, 누적사망자),
         누적사망자 = ifelse(날짜 == "2020-06-23", 280, 누적사망자)) %>% 
  mutate(검사자 = 누적검사자 - lag(누적검사자, n = 1L),
         확진자 = 누적확진자 - lag(누적확진자, n = 1L),
         사망자 = 누적사망자 - lag(누적사망자, n = 1L))


covid_age_daily_df %>% 
  select(-contains("누적")) %>% 
  pivot_longer(-날짜) %>% 
  plot_time_series(.date_var   = 날짜, 
                   .value      = value,
                   .facet_var  = name,
                   .facet_ncol = 2)
covid_age_gender_df %>% 
  arrange(날짜)
# A tibble: 2,949 x 7
   날짜       구분    검사자 확진자 사망자 감염율 치명율
   <date>     <chr>    <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
 1 2020-04-02 0-9      9825.    112      0 0.0114 0     
 2 2020-04-02 10-19    9791.    515      0 0.0526 0     
 3 2020-04-02 20-29    9786.   2656      0 0.271  0     
 4 2020-04-02 30-39    9787.   1012      1 0.103  0.0062
 5 2020-04-02 40-49    9784.   1312      1 0.134  0.0062
 6 2020-04-02 50-59    9788.   1851     10 0.189  0.0617
 7 2020-04-02 60-69    9786.   1235     22 0.126  0.136 
 8 2020-04-02 70-79    9789.    651     46 0.0665 0.284 
 9 2020-04-02 80 이상  9779.    442     82 0.0452 0.506 
10 2020-04-02 여성     9785.   5881     80 0.601  0.494 
# ... with 2,939 more rows

1.2 * 연령별 치명률

연령대별로 치명률(Death Rate)을 치명률이 높은 고연령대를 중심으로 시각화하면 연령대가 높아짐에 따라 높아짐을 확인할 수 있다.

covid_age_gender_df %>% 
  mutate(치명율 = 치명율 * 100) %>% 
  filter(!str_detect(구분, pattern = "(남성)|(여성)")) %>% 
  filter(!str_detect(구분, "(0-11)|(0-9)|(10-19)|(20-29)|(30-39)|(40-49)")) %>% 
  timetk::plot_time_series(.date_var     = 날짜, 
                           .value        = 치명율, 
                           .facet_var    = 구분,
                           .interactive  = FALSE,
                           .smooth       = FALSE,
                           .facet_ncol   = 4,
                           .facet_scales = "fixed") +
  scale_y_continuous(labels = scales::comma) +
  scale_x_date(labels = scales::date_format(format = "%y-%m")) +
  labs(title = "코로나19 연령대별 치명률 추세")

고연령층(50세 이상)을 대상으로 살펴보면 남성이 여성보다 다소 높은 것을 확인할 수 있다.

covid_age_gender_df %>% 
  mutate(치명율 = 치명율 * 100) %>% 
  filter(!str_detect(구분, "(0-11)|(0-9)|(10-19)|(20-29)|(30-39)|(40-49)")) %>% 
  filter(str_detect(구분, pattern = "(남성)|(여성)")) %>% 
  timetk::plot_time_series(.date_var     = 날짜, 
                           .value        = 치명율, 
                           .facet_var    = 구분,
                           .interactive  = FALSE,
                           .smooth       = FALSE,
                           .facet_ncol   = 2,
                           .facet_scales = "fixed") +
  scale_y_continuous(labels = scales::comma) +
  scale_x_date(labels = scales::date_format(format = "%y-%m")) +
  labs(title = "코로나19 고연령층 성별 치명률 추세")

 

데이터 과학자 이광춘 저작

kwangchun.lee.7@gmail.com